iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
DevOps

n8n x AI自動化之新手村系列 第 23

Day23 運動打卡

  • 分享至 

  • xImage
  •  

現代人運動容易斷斷續續,想要持續紀錄運動,又不想每天手動記錄。希望透過 n8n 自動化,讓使用者輸入今日運動內容,即可自動生成紀錄、計算消耗熱量存進Notion,後續也可以進行追蹤,且還會即時收到鼓勵訊息,提升運動動力。

實作

https://ithelp.ithome.com.tw/upload/images/20250905/20168759EYWYfLD7Om.png

  1. 建立manual trigger
  2. 建立 Date&Time節點以取得當日日期時間
  3. 建立gemini節點來整理文字格式
    1. system prompt

你是一個運動紀錄助手,負責將使用者輸入的自然語言運動內容,轉換成標準化 JSON,方便存入 Notion。
請嚴格依照指定格式輸出,不要包含多餘的文字。

【輸入範例】
「在河堤跑步30分鐘」
「健身房重訓1小時」
「晚上散步2公里」

【輸出 JSON 格式】
{

"date": "YYYY-MM-DD", // 現在時間是: {{ $json.currentDate }}
"exercise": "運動內容", // 例如:跑步、重訓、散步

"location": "地點", // 若無提及地點則為 null

"duration": "時數", // 以分鐘為單位,若輸入為小時需轉換

"calories": "消耗的卡路里" // 根據運動類型與時間自動計算
}

【卡路里計算規則】

  • 跑步: 10 kcal/分鐘
  • 健走: 5 kcal/分鐘
  • 騎車: 8 kcal/分鐘
  • 重訓: 6 kcal/分鐘
  • 其他運動: 8 kcal/分鐘

【注意事項】

  • 所有數字需轉換成阿拉伯數字(例如「三十分鐘」→ 30)
  • 時間統一換算成分鐘
  • 距離統一換算成公里
  • 若輸入中缺少某欄位,請輸出 null
  • 僅輸出 JSON,不要解釋

💡這裡的卡路里計算事先隨意取的數字用來測試計算

  1. 建立code節點
    1. 把資料整理成適合 Notion Database 的欄位結構,因此需要轉成JSON。這裡使用Chat GPT幫忙生成程式碼
// 解析 Gemini 回傳
let raw = $input.first().json.content.parts[0].text || "";
raw = raw.replace(/```json|```/g, '').trim();

let parsed;
try {
  parsed = JSON.parse(raw);

  // 將 null 或 undefined 欄位改成空字串
  Object.keys(parsed).forEach(key => {
    if (parsed[key] === null || parsed[key] === undefined) {
      parsed[key] = "";
    }
  });

  // 確保 Rich Text 欄位為字串
  if (parsed.duration !== undefined) parsed.duration = String(parsed.duration);
  if (parsed.distance !== undefined) parsed.distance = String(parsed.distance);
  if (parsed.calories !== undefined) parsed.calories = String(parsed.calories);

} catch (error) {
  parsed = { error: "JSON parse failed", raw };
}

return parsed;

// 在轉JSON節點中加入更嚴格的驗證
if (!parsed.exercise || parsed.exercise.trim() === '') {
    return { error: "運動內容不能為空", raw };
}

https://ithelp.ithome.com.tw/upload/images/20250905/20168759UDOAGSLPuI.png

  1. 前往Notion建立一個database,並設定好欄位(運動內容、運動日期、運動地點、運動時間(分鐘)、消耗熱量)
  2. 建立Notion節點,功能選用Create a database page
    1. 將每一欄位的對應值放入
  3. 建立gemini節點用於編輯訊息
    1. system prompt

你是使用者的運動激勵助理。假設使用者今天已經完成運動,你的任務是生成一則簡短、正向、鼓勵的訊息,內容有趣、溫暖,並包含以下要點:

  1. 讚美使用者今天的運動努力與堅持。
  2. 附上今日運動消耗的熱量: {{ $json.properties['消耗熱量'].rich_text[0].text.content }}
  3. 提供明日可做的運動建議,保持輕鬆、鼓勵的語氣,建議不要天天一樣,內容可隨機從不同運動類型挑選,例如:跑步、散步、瑜伽、騎車、重訓、伸展。
  4. 訊息短小精悍,一句話或兩句話即可。
  5. 可加入 emoji 增加趣味感,例如 💪🏃‍♂️🌞🎉。
  6. 不要輸出 JSON 或其他格式,僅文字訊息。
  7. 語氣溫暖、有趣,讓使用者感到被鼓勵。
  8. 運動建議可加入小創意或小挑戰,例如「明天試試晨跑加伸展吧!」、「晚上散步20分鐘,順便看看星空!」。
  1. 建立telegram節點,功能選用send a message

成果

https://ithelp.ithome.com.tw/upload/images/20250905/20168759aUbKEPH574.png
https://ithelp.ithome.com.tw/upload/images/20250905/201687599UYEFFKEgN.png
https://ithelp.ithome.com.tw/upload/images/20250905/201687592WjF7Gn88F.png

在一開始,我預想使用者可以透過 Telegram 輸入今日的運動,自動記錄到 Notion,並且每天晚上九點由 n8n 檢查當天是否有運動:有運動時讚美使用者的努力與堅持,沒有運動時則鼓勵使用者開始動起來。然而,我在實作過程中遇到兩個主要挑戰。首先,Telegram Trigger 無法成功讀取聊天室訊息,一直顯示自動生成的 Webhook URL 錯誤,我推測這可能與 ngrok 生成的 URL 有關。其次,在檢查使用者當天是否運動時,遇到 Notion 日期欄位無法準確對應當天時間的問題,導致無法順利判斷運動狀態。雖然目前還無法完全解決這些問題,但這個過程讓我學到了 n8n、Telegram 與 Notion 整合的挑戰與細節。未來有時間,我一定會持續優化,讓整個自動化流程更加穩定、完整。


上一篇
Day22 Notion 基本連接與介紹
下一篇
Day24 運動打卡+激勵機制 (進階版)
系列文
n8n x AI自動化之新手村28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言